// hdu5787
// 题意：
// 一个整数x是k-wolf数当且仅当每k(<=5)个相邻的数字都两两都不同，如果不足没事
// 不考虑前导零。要求[l, r]范围内k-wolf的个数，(l, r<=10^18)。
//
// 题解：
// 因为k<=5，我们只需要保存当前位置前k-1位数是什么，所以我们可以设计状态
// f[i][t][equal][ck]表示从高到低第i位，目前前面不算前导零有效的ck位数是
// t，以及到现在是小于边界还是等于边界。
// 转移不是很复杂。
//
#include <iostream>
#include <cstring>

using ll = long long;
ll l, r;
int k;

int const maxn = 20;
ll f[maxn][10007][2][7]; // 0 for equal, 1 for less,

int const opt[] = {1, 10, 100, 1000, 10000};
int upper(int k) { return opt[k - 1]; }
int add(int x, int d) { x = x * 10 + d; return x % upper(k); }
void update(ll & x, ll d) { if (x < 0) x = 0; x += d; }

bool check(int x, int d, int now)
{
	int a[7];
	for (int i = 0; i < k - 1; i++, x /= 10) a[i] = x % 10;
	for (int i = 0; i < std::min(k - 1, now); i++)
		if (d == a[i]) return false;
	return true;
}

int a[maxn];

ll calc(ll x)
{
	int len = 0;
	for (; x; x /= 10) a[len++] = x % 10;
	memset(f, -1, sizeof(f));
	f[0][0][0][0] = 1;
	for (int i = 0; i < len; i++) {
		int now = a[len - i - 1];
		for (int j = 0; j < upper(k); j++) {
			for (int l = 0; l < k; l++) {
				if (f[i][j][0][l] >= 0) {
					for (int t = 0; t <= now; t++) {
						if (!check(j, t, l)) continue;
						int ll = l;
						if (t || l) ll = std::min(k - 1, l + 1);
						if (t < now)
							update(f[i + 1][add(j, t)][1][ll], f[i][j][0][l]);
						else
							update(f[i + 1][add(j, t)][0][ll], f[i][j][0][l]);
					}
				}
				if (f[i][j][1][l] >= 0) {
					for (int t = 0; t < 10; t++) {
						if (!check(j, t, l)) continue;
						int ll = l;
						if (t || l) ll = std::min(k - 1, l + 1);
						update(f[i + 1][add(j, t)][1][ll], f[i][j][1][l]);
					}
				}
			}
		}
	}

//	std::cerr << "\n";

	ll ret = 0;
	for (int i = 0; i < upper(k); i++) {
		for (int j = 0; j < k; j++) {
			if (f[len][i][0][j] >= 0) ret += f[len][i][0][j];
			if (f[len][i][1][j] >= 0) ret += f[len][i][1][j];
		}
	}

	return ret;
}

int main()
{
	std::ios_base::sync_with_stdio(false);
	while (std::cin >> l >> r >> k) {
		std::cout << calc(r) - calc(l - 1) << "\n";
	}
}

